Software development can be a difficult process involving a number of interwoven technologies. For example, software developers typically write software in human-readable source code which is converted into machine-readable object code by a compiler. After compilation, the developers may use a debugger to find errors in the code. Still other software development tools, such as optimizers, can be used as desired.
A typical software development technique is shown in FIG. 1. In the technique, unfinished software 104 is processed by various software development tools 106 (e.g., an optimizer 110A or a compiler 110B) to generate executable software 122, which is suitable for execution on a target architecture 132.
Software developers typically employ the software development tools 106 in an iterative process until the software is ready for execution. Over the lifetime of the software project, further enhancements, improvements, and optimizations can be made to the executable software 122.
Such software development tools can comprise various components, such as assemblers, disassemblers, decoders, encoders, instruction selection components, and instruction legalization components. Often, such components have overlapping requirements, and the components themselves may appear in more than one development tool (e.g., in a compiler and a debugger).
Despite the widespread necessity for similar component functionality, software development tool components are traditionally developed in isolation with little or no sharing of design or implementation. Each component for each tool on each architecture has its own implementation, resulting in much redundant work and duplicated code. Additionally, there may be little uniformity across architectures, even within the same source base. Therefore, any defects detected in the code of one component are corrected for a specific implementation, but the correction is not automatically propagated to other tools or architectures implementing the same functionality.